查看原文
其他

Android 7.0对受信任的证书颁发机构做出变更

2016-07-21 DevRel 谷歌开发者

在 Android Nougat (7.0) 中,我们更改了 Android 处理受信任证书颁发机构 (CA) 的方式,从而提供了更安全的系统默认设置,保障了应用流量安全。大多数应用和用户不受这些变更的影响,也不需要采取任何行动。这些变更包括: 


  • 安全而简单的 API,用于信任自定义 CA。

  • 默认情况下,针对 API 级别 24 及以上版本而开发的应用不再信任用户或管理员为安全连接添加的 CA。

  • 所有运行 Android Nougat 的设备均提供同一套标准化的系统 CA,而没有任何设备特定的自定义 CA。


如需详细了解这些变更以及倘若这些变更影响到您,您应当如何应对,请继续阅读本文。 

安全而简单的 API
一直以来,应用都可以自定义它们信任哪些证书颁发机构。然而,我们发现,由于 Java TLS API 过于复杂,导致有些应用出现失误。为了解决这个问题,我们改进了 API,以便更好地自定义信任。 

用户添加的 CA
保护所有应用数据是 Android 应用沙箱的关键目标之一。Android Nougat 更改了应用与用户及管理员提供的 CA 的交互方式。从设计上讲,针对 API 级别 24 开发的应用除非明确指定接受此类 CA,否则,默认视为不接受。这种默认安全的设置可以减小应用的攻击面,同时鼓励以一致的方式处理基于网络和文件的应用数据。 

自定义信任的 CA
在 Android Nougat 上,可以使用网络安全性配置轻松自定义应用信任的 CA。可以针对整个应用指定信任,也可以根据需要仅针对特定域连接指定信任。以下示例演示了如何信任系统 CA 之外的某个自定义 CA(即用户添加的 CA)。如需了解更多示例和详情,请参阅完整文档:developer.android.com/preview/features/security-config.html
1. 出于调试目的信任自定义 CA

要允许应用仅出于本地调试目的而信任自定义 CA,请在您的网络安全性配置中加入如下代码。只有在您的应用被标记为可调试时,才会信任这些 CA。 
<network-security-config>  
     <debug-overrides>  
          <trust-anchors>  
               <!-- Trust user added CAs while debuggable only -->
               <certificates src="user" />  
          </trust-anchors>  
     </domain-config>  
</network-security-config>


2. 针对某个域信任自定义 CA

要允许应用仅针对特定域信任自定义 CA,请在您的网络安全性配置中加入如下代码。 
<network-security-config>  
     <domain-config>  
          <domain includeSubdomains="true">internal.example.com</domain>  
          <trust-anchors>  
               <!-- Only trust the CAs included with the app  
                    for connections to internal.example.com -->  
               <certificates src="@raw/cas" />  
          </trust-anchors>  
     </domain-config>  
</network-security-config>


3. 针对某些域信任用户添加的 CA

要允许应用针对多个域信任用户添加的 CA,请在您的网络安全性配置中加入如下代码。 
<network-security-config>  
     <domain-config>  
          <domain includeSubdomains="true">userCaDomain.com</domain>  
          <domain includeSubdomains="true">otherUserCaDomain.com</domain>  
          <trust-anchors>  
                 <!-- Trust preinstalled CAs -->  
                 <certificates src="system" />  
                 <!-- Additionally trust user added CAs -->  
                 <certificates src="user" />  
          </trust-anchors>  
     </domain-config>  
</network-security-config>


4. 针对除特定域之外的所有域信任用户添加的 CA

要允许应用针对除指定域之外的所有域信任用户添加的 CA,请在您的网络安全性配置中加入如下代码。 
<network-security-config>  
     <base-config>  
          <trust-anchors>  
               <!-- Trust preinstalled CAs -->  
               <certificates src="system" />  
               <!-- Additionally trust user added CAs -->  
               <certificates src="user" />  
          </trust-anchors>  
     </base-config>  
     <domain-config>  
          <domain includeSubdomains="true">sensitive.example.com</domain>  
          <trust-anchors>  
               <!-- Only allow sensitive content to be exchanged  
            with the real server and not any user or  
   admin configured MiTMs -->  
               <certificates src="system" />  
          <trust-anchors>  
     </domain-config>  
</network-security-config>


5. 针对所有安全连接信任用户添加的 CA

要允许应用针对所有安全连接信任用户添加的 CA,请在您的网络安全性配置中加入如下代码。 
<network-security-config>  
     <base-config>  
           <trust-anchors>  
               <!-- Trust preinstalled CAs -->  
               <certificates src="system" />  
               <!-- Additionally trust user added CAs -->  
               <certificates src="user" />  
          </trust-anchors>  
     </base-config>  
</network-security-config>



标准化的系统信任 CA

为了在整个 Android 生态系统中提供更一致、更安全的体验,从 Android Nougat 开始,兼容的设备将仅信任在 AOSP 中维护的标准化系统 CA。 

在此之前,随系统捆绑预装的 CA 会随设备不同而不同。如果某些设备并不包含应用连接所需的 CA,这可能会导致兼容性问题,而如果某些设备上包含的 CA 不符合我们的安全要求,还可能导致潜在的安全问题。 



我有一个 CA,我相信应当包含在 Android 中,我该如何做?
首先,请确保您的 CA 确实需要包含在 Android 系统中。预装的 CA 仅限于符合我们的安全要求的 CA,因为它们会影响设备上大多数应用的安全连接。如果您需要添加某个 CA,以便连接到使用该 CA 的主机,您应当自定义连接到这些主机的应用和服务。如需了解详细信息,请参阅上文的自定义信任的 CA 部分。 

如果您运营某个认为应当包含在 Android 中的 CA,请先完成 Mozilla CA 纳入流程,然后提交针对 Android 的功能请求,以将此 CA 添加到标准化系统 CA 中。 



查看文中所有链接,请点击文末阅读原文。


7.21 Google Doodle: 2016 年比利时国庆日


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存